/* 
 * File:   main.cpp
 * Author: Maximiliano Monzon (82341)
 *
 * Created on October 19, 2012, 9:30 PM
 */

#include <cstdlib>
#include <sstream>
#include <fstream>
#include "server_Servidor.h"
#include "common_Excepcion.h"
#include "common_ServerConfFileManager.h"

using namespace std;
using namespace TP;
using namespace TP::Comunicacion;

#define PATH_CONF_FILE "config.xml"
#define ARCHIVO_CONFIGURACION_INEXISTENTE 1

void Verificaciones () throw (uint32_t);

void loguearError (uint32_t pCodigoError);

void loguearError (const string &pMensajeError);

int main(int argc, char** argv) {
    
    Servidor* servidor = NULL;  
    
    try
    {
        Verificaciones();
        
        ServerConfFileManager confFileManager(string(PATH_CONF_FILE));

        servidor = new Servidor(&confFileManager);
        servidor->Iniciar();
        
        string comando = "";

        while (std::getline(cin, comando, '\n'))
        {
            if ("q" == comando)
                break;
            else
                cout << endl << "Comando invalido..." << endl << endl << "Salir (q): ";;
        }
    }
    catch (uint32_t pEx)
    {
        loguearError (pEx);
    }
    catch (Excepcion& pEx)
    {
        loguearError (pEx.what());
    } 

    // Libero los recursos ocupado por el servidor.
    //
    if (servidor != NULL)
    {
        try
        {
            servidor->Finalizar();
        }
        catch (Excepcion& ex)
        {
            loguearError(ex.what());
        }
        delete servidor;
    }
    return EXIT_SUCCESS;
}

void Verificaciones () throw (uint32_t){

    // Si no existe el archivo de configuracion, no se puede iniciar la aplicacion.
    
    ifstream confFile(PATH_CONF_FILE);
    bool archivoExistente = true;
    
    if (!confFile) {
        cout << "No se pudo encontrar el archivo config.xml" << endl;
        cout << "No se pudo iniciar la aplicacion." << endl;
        cout << "Defina una configuracion valida para el servidor, utilizando" <<
        cout << " el editor." << endl;
        archivoExistente = false;
    }

    confFile.close();
    
    if (!archivoExistente)
    {
        throw ARCHIVO_CONFIGURACION_INEXISTENTE;
    }
}

void loguearError (uint32_t pCodigoError){
    
    switch (pCodigoError)
    {
        case ARCHIVO_CONFIGURACION_INEXISTENTE:
            cerr << "Fallo al abrir el archivo de configuracion. Archivo inexistente." << endl;
            break;
    }
}

void loguearError (const string &pMensajeError){
    cerr << pMensajeError << endl;
}